/**
 * PHOSIDE: PHosphorylation Site IDentification Engine.
 * Copyright 2009 Digital Biology Lab, University of Missouri.
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 3 of the License, or (at your option) any later
 * version. <p/> This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more
 * details.
 */

package phoside;

import java.util.Map;
import java.util.Set;

/**
 *
 * @author gjj
 */
public interface Protein {

    /**
     * Get the Accession number
     * @return accession number
     */
    public String getAccession();

    /**
     *
     * @param accession accession number
     */
    public void setAccession(String accession);

    /**
     *
     * @return protein name.
     */
    public String getSymbol();

    /**
     * set protein name.
     * @param name protein name.
     */
    public void setSymbol(String symbol);

    /**
     * Get species
     * @return species
     */
    public String getSpecies();

    /**
     *
     * @param species
     */
    public void setSpecies(String species);

    /**
     * Get protein sequence.
     * @return sequence
     */
    public String getSequence();

    /**
     *
     * @param sequence
     */
    public void setSequence(String sequence);

    /**
     * Get protein description.
     * @return protein description.
     */
    public String getDescription();

    /**
     * 
     * @param description
     */
    public void setDescription(String description);

    /**
     * 
     * @param protein
     * @param replace
     * @param infoTypes
     */
    public void copyFrom(Protein protein, boolean replace, Set<String> infoTypes);

    /**
     *
     * @return protein information. Key: type of information; value: informaiton.
     */
    public Map<String,Object> getInfoMap();

    /**
     * Add protein information.
     * @param infoType type of information.
     * @param infoValue information.
     * @return the previous information with this type or null if not exist 
     * previously.
     */
    public Object putInfo(String infoType, Object infoValue);

    /**
     *
     * @param infoType type of information.
     * @return protein information of a specific type; null if not exist.
     */
    public Object getInfo(String infoType);

    /**
     *
     * @param infoType type of information.
     * @return the previous information of this type or null if not exist.
     */
    public Object removeInfo(String infoType);

    /**
     * 
     * @param infoTypes type of information.
     *
     * @return true if changed as a result.
     */
    public boolean keepInfo(Set<String> infoTypes);
}
